package com.wmwj.hxlj.mapper;

import com.wmwj.hxlj.entity.Category;
import org.apache.ibatis.annotations.*;

import java.time.LocalDateTime;
import java.util.List;

@Mapper
public interface CategoryMapper {

    /**
     * 根据类别ID查询类别信息
     *
     * @param id 类别的唯一标识
     * @return 返回查询到的类别对象，如果未找到则返回null
     */
    @Select("SELECT * FROM category WHERE id = #{id}")
    Category findById(Integer id);

    /**
     * 查询所有启用的类别信息
     *
     * @return 返回所有启用的类别对象列表，按照sort_order字段升序排序
     */
//    @Select("SELECT * FROM category WHERE status = 1 ORDER BY sort_order ASC")
    @Select("SELECT * FROM category ORDER BY sort_order ASC LIMIT #{pageStart}, #{pageSize}")
    List<Category> findAllEnabled(int pageStart, int pageSize);

    /**
     * 根据父类别ID查询所有启用的子类别信息
     *
     * @param parentId 父类别的唯一标识
     * @return 返回父类别下所有启用的子类别对象列表，按照sort_order字段升序排序
     */
    @Select("SELECT * FROM category WHERE parent_id = #{parentId} AND status = 1 ORDER BY sort_order ASC")
    List<Category> findByParentId(Long parentId);

    /**
     * 插入新的类别信息到数据库
     *
     * @param category 要插入的类别对象，包括name, description, parentId, level, sortOrder, createTime, updateTime, status等字段
     * @return 返回插入操作影响的行数
     */
    @Insert("INSERT INTO category (name, description, parent_id, level, sort_order, create_time, update_time, status) " +
            "VALUES (#{name}, #{description}, #{parentId}, #{level}, #{sortOrder}, #{createTime}, #{updateTime}, #{status})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(Category category);

    /**
     * 更新类别信息
     *
     * @param category 要更新的类别对象，包括id, name, description, parentId, level, sortOrder, updateTime, status等字段
     * @return 返回更新操作影响的行数
     */
    @Update("UPDATE category SET name = #{name}, description = #{description}, " +
            "parent_id = #{parentId}, level = #{level}, sort_order = #{sortOrder}, " +
            "update_time = #{updateTime}, status = #{status} WHERE id = #{id}")
    int update(Category category);

    /**
     * 根据类别ID删除类别信息(软删除）
     *
     * @param id 要删除的类别的唯一标识
     * @return 返回删除操作影响的行数
     */
    @Update("UPDATE category SET status = 0, update_time = NOW() WHERE id = #{id}")
    int deleteById(Integer id);

    /**
     * 统计指定类别的子类别数量
     *
     * @param id 要统计的类别的唯一标识
     * @return 返回子类别的数量
     */
    @Select("SELECT COUNT(*) FROM category WHERE parent_id = #{id}")
    int countChildren(Integer id);

    /**
     * 更新类别的状态
     *
     * @param id 类别的唯一标识
     * @param status 新的状态值
     * @param updateTime 更新时间
     * @return 返回更新操作影响的行数
     */
    @Update("UPDATE category SET status = #{status}, update_time = #{updateTime} WHERE id = #{id}")
    int updateStatus(@Param("id") Long id, @Param("status") Integer status, @Param("updateTime") LocalDateTime updateTime);

    /**
     * 获取等级为1的类别列表
     *
     * @return 返回父类别下的所有类别对象列表，按照sort_order字段升序排序
     */
    @Select("SELECT * FROM category WHERE level = 1 ORDER BY sort_order ASC")
//    @Select("SELECT * FROM category WHERE level = 1 ORDER BY sort_order ASC LIMIT #{pageStarts}, #{pageSize}")
    List<Category> findLevel1ByParentId();

    /**
     * 获取等级为2的类别列表
     *
     * @return 父类别下的所有类别对象列表，按照sort_order字段升序排序
     */
    @Select("SELECT * FROM category WHERE level = 2 ORDER BY sort_order ASC")
//    @Select("SELECT * FROM category WHERE level = 2 ORDER BY sort_order ASC LIMIT #{pageStarts}, #{pageSize}")
    List<Category> findLevel2ByParentId();

    /**
     * 根据名称查询类名
     *
     * @return 父类别下的所有类别对象列表，按照sort_order字段升序排序
     */
    @Select("SELECT * FROM category WHERE name = #{name} AND status = 1")
    Category findByName(String name);
    //  查询所有类别数量
    @Select("SELECT COUNT(*) FROM category")
    int count();
}
